package response

import (
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

// Response 统一响应结构体
type Response struct {
	Code      int         `json:"code"`      // 状态码：0表示成功，非0表示错误
	Message   string      `json:"message"`   // 提示信息
	Data      interface{} `json:"data"`      // 返回数据
	Timestamp int64       `json:"timestamp"` // 时间戳
	Success   bool        `json:"success"`   // 是否成功
}

// PageResponse 分页响应结构体
type PageResponse struct {
	Total    int64       `json:"total"`     // 总记录数
	Records  interface{} `json:"list"`      // 当前页数据
	Page     int         `json:"page"`      // 当前页码
	PageSize int         `json:"page_size"` // 每页大小
}

// APIResponse API响应接口
type APIResponse interface {
	ToJSON() map[string]interface{}
}

// NewResponse 创建新的响应结构体
func NewResponse(code int, message string, data interface{}) *Response {
	return &Response{
		Code:      code,
		Message:   message,
		Data:      data,
		Timestamp: time.Now().Unix(),
		Success:   code == 0,
	}
}

// Success 成功响应
func Success(c *gin.Context, data interface{}) {
	resp := NewResponse(200, "操作成功", data)
	c.JSON(http.StatusOK, resp)
}

// SuccessWithMessage 带自定义消息的成功响应
func SuccessWithMessage(c *gin.Context, message string, data interface{}) {
	resp := NewResponse(0, message, data)
	c.JSON(http.StatusOK, resp)
}

// Error 错误响应
func Error(c *gin.Context, code int, message string) {
	resp := NewResponse(code, message, nil)
	c.JSON(http.StatusOK, resp)
}

// ErrorWithData 带数据的错误响应
func ErrorWithData(c *gin.Context, code int, message string, data interface{}) {
	resp := NewResponse(code, message, data)
	c.JSON(http.StatusOK, resp)
}

// PageSuccess 分页成功响应
func PageSuccess(c *gin.Context, total int64, records interface{}, page int, pageSize int) {
	pageData := PageResponse{
		Total:    total,
		Records:  records,
		Page:     page,
		PageSize: pageSize,
	}
	resp := NewResponse(200, "获取成功", pageData)
	c.JSON(http.StatusOK, resp)
}

// ParamError 参数错误响应
func ParamError(c *gin.Context) {
	resp := NewResponse(400, "请求参数错误", nil)
	c.JSON(http.StatusBadRequest, resp)
}

// ParamErrorWithMessage 带自定义消息的参数错误响应
func ParamErrorWithMessage(c *gin.Context, message string) {
	resp := NewResponse(400, message, nil)
	c.JSON(http.StatusBadRequest, resp)
}

// Unauthorized 未授权响应
func Unauthorized(c *gin.Context) {
	resp := NewResponse(401, "未授权，请登录", nil)
	c.JSON(http.StatusUnauthorized, resp)
}

// UnauthorizedWithMessage 带自定义消息的未授权响应
func UnauthorizedWithMessage(c *gin.Context, message string) {
	resp := NewResponse(401, message, nil)
	c.JSON(http.StatusUnauthorized, resp)
}

// Forbidden 禁止访问响应
func Forbidden(c *gin.Context) {
	resp := NewResponse(403, "拒绝访问", nil)
	c.JSON(http.StatusForbidden, resp)
}

// ForbiddenWithMessage 带自定义消息的禁止访问响应
func ForbiddenWithMessage(c *gin.Context, message string) {
	resp := NewResponse(403, message, nil)
	c.JSON(http.StatusForbidden, resp)
}

// NotFound 资源不存在响应
func NotFound(c *gin.Context) {
	resp := NewResponse(404, "请求资源不存在", nil)
	c.JSON(http.StatusNotFound, resp)
}

// NotFoundWithMessage 带自定义消息的资源不存在响应
func NotFoundWithMessage(c *gin.Context, message string) {
	resp := NewResponse(404, message, nil)
	c.JSON(http.StatusNotFound, resp)
}

// ServerError 服务器错误响应
func ServerError(c *gin.Context) {
	resp := NewResponse(500, "服务器内部错误", nil)
	c.JSON(http.StatusInternalServerError, resp)
}

// ServerErrorWithMessage 带自定义消息的服务器错误响应
func ServerErrorWithMessage(c *gin.Context, message string) {
	resp := NewResponse(500, message, nil)
	c.JSON(http.StatusInternalServerError, resp)
}

// ToJSON 实现APIResponse接口
func (r *Response) ToJSON() map[string]interface{} {
	return map[string]interface{}{
		"code":      r.Code,
		"message":   r.Message,
		"data":      r.Data,
		"timestamp": r.Timestamp,
		"success":   r.Success,
	}
}
